/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Domain;

import Jama.Matrix;
import java.io.Serializable;

/**
 *
 * @author Memet
 */
public class Laminaat implements Serializable{

    Matrix lam;
    String naam;

    /**
     * Maakt een nieuw laminaat aan
     * @param row het aantal rijen
     */
    public Laminaat(int row) {
        this.lam = new Matrix(row, 4);
        for(int i = 0;i<lam.getRowDimension();i++)
        {
            lam.set(i, 0, i+1);
        }
    }

    /**
     * Maakt een nieuw laminaat aan
     */
    public Laminaat() {
        this.lam = new Matrix(0, 4);
        for(int i = 0;i<lam.getRowDimension();i++)
        {
            lam.set(i, 0, i+1);
        }
    }


    /**
     * Kijkt of het laminaat lagen heeft
     * @return of het laminaat lagen heeft
     */
    public boolean isEmpty()
    {
        if(lam.getRowDimension() == 0)
        {
            return true;
        }
        return false;
    }

    /**
     * De matrix van het laminaat
     * @return de matrix van het laminaat
     */
    public Matrix getLam() {
        return lam;
    }

    /**
     * De matrix van het laminaat
     * @param lam de matrix van het laminaat
     */
    public void setLam(Matrix lam) {
        this.lam = lam;
    }

    /**
     * Veranderd een specifieke rij
     * @param rijNr het nummer van de rij (deze mag niet groter zijn dan de groote van het laminaat)
     * @param matNr Het ID van het materiaal
     * @param hoek de hoek waarin het materiaal ligt
     * @param dikte de dikte van het laminaat
     */
    public void setRow(int rijNr, int matNr, double hoek, double dikte)
    {
        lam.set(rijNr-1, 1, matNr);
        lam.set(rijNr-1, 2, hoek);
        lam.set(rijNr-1, 3, dikte);
    }

    /**
     * De naam van het laminaat
     * @return de naam van het laminaat
     */
    public String getNaam() {
        return naam;
    }

    /**
     * de naam van het laminaat
     * @param naam de naam van het laminaat
     */
    public void setNaam(String naam) {
        this.naam = naam;
    }

    /**
     * het excact kopieren van het object
     * @return exacte kopie van het object
     */
    @Override
    public Laminaat clone()
    {
        Laminaat l = new Laminaat(lam.getRowDimension());
        l.setLam((Matrix) lam.clone());
        l.setNaam(naam);
        return l;
    }

    /**
     * Voegt een rij toe boven op het laminaat
     * @param matNr Het id van het materiaal
     * @param hoek de hoek waarin het materiaal ligt
     * @param dikte de dikte van het materiaal
     */
    public void addRowBefore(int matNr, double hoek, double dikte)
    {
        Matrix newLam = new Matrix(lam.getRowDimension()+1, 4);
        double holdMatNr = matNr;
        double holdHoek = hoek;
        double holdDikte = dikte;
        int t = 0;
        for(int i = 0;i < lam.getRowDimension()+1; i++)
        {
            double newMatNr = holdMatNr;
            double newHoek = holdHoek;
            double newDikte = holdDikte;
            if(i<lam.getRowDimension())
            {
                holdMatNr = lam.get(i, 1);
                holdHoek = lam.get(i, 2);
                holdDikte = lam.get(i, 3);
            }
            newLam.set(i, 1, newMatNr);
            newLam.set(i, 2, newHoek);
            newLam.set(i, 3, newDikte);
            t = i;
        }
        newLam.set(t, 1, holdMatNr);
        newLam.set(t, 2, holdHoek);
        newLam.set(t, 3, holdDikte);
        lam = newLam;
    }

    /**
     * Voegt een rij toe onder het laminaat
     * @param matNr Het id van het materiaal
     * @param hoek de hoek waarin het materiaal ligt
     * @param dikte de dikte van het materiaal
     */
    public void addRowAfter(int matNr, double hoek, double dikte)
    {
        Matrix newLam = new Matrix(lam.getRowDimension()+1, 4);
        for(int i = 0; i < lam.getRowDimension(); i++)
        {
            newLam.set(i, 0, lam.get(i, 0));
            newLam.set(i, 1, lam.get(i, 1));
            newLam.set(i, 2, lam.get(i, 2));
            newLam.set(i, 3, lam.get(i, 3));
        }
        newLam.set(newLam.getRowDimension()-1, 0, newLam.getRowDimension());
        newLam.set(newLam.getRowDimension()-1, 1, matNr);
        newLam.set(newLam.getRowDimension()-1, 2, hoek);
        newLam.set(newLam.getRowDimension()-1, 3, dikte);
        lam = newLam;
    }


    public void addRowAfter(Materiaal mat, double hoek, double dikte)
    {
        Matrix newLam = new Matrix(lam.getRowDimension()+1, 4);
        for(int i = 0; i < lam.getRowDimension(); i++)
        {
            newLam.set(i, 0, lam.get(i, 0));
            newLam.set(i, 1, lam.get(i, 1));
            newLam.set(i, 2, lam.get(i, 2));
            newLam.set(i, 3, lam.get(i, 3));
        }
        newLam.set(newLam.getRowDimension()-1, 0, newLam.getRowDimension());
        newLam.set(newLam.getRowDimension()-1, 1, mat.getId());
        newLam.set(newLam.getRowDimension()-1, 2, hoek);
        newLam.set(newLam.getRowDimension()-1, 3, dikte);
        lam = newLam;
    }

    @Override
    public String toString() {
        return naam;
    }


    /**
     * verwijderd alle lagen uit het laminaat
     */
    public void clearAll()
    {
        lam = new Matrix(0,4);
    }

    /**
     * verwijderd de laatste rij in het laminaat
     */
    public void deleteLast()
    {
        Matrix newLam = new Matrix(lam.getRowDimension()-1, 4);
        for(int i = 0; i < lam.getRowDimension()-1; i++)
        {
            newLam.set(i, 1, lam.get(i, 1));
            newLam.set(i, 2, lam.get(i, 2));
            newLam.set(i, 3, lam.get(i, 3));
        }
        lam = newLam;
    }


    public void moveUp(int rijNr)
    {

        if(rijNr != 1)
        {
            rijNr--;
            double holdMat = lam.get(rijNr, 1);
            double holdHoek = lam.get(rijNr, 2);
            double holdDikte = lam.get(rijNr, 3);
            lam.set(rijNr, 1, lam.get(rijNr-1, 1));
            lam.set(rijNr, 2, lam.get(rijNr-1, 2));
            lam.set(rijNr, 3, lam.get(rijNr-1, 3));
            lam.set(rijNr-1, 1, holdMat);
            lam.set(rijNr-1, 2, holdHoek);
            lam.set(rijNr-1, 3, holdDikte);
        }

    }

    public void moveDown(int rijNr)
    {

        if(rijNr != lam.getRowDimension())
        {
            rijNr--;
            double holdMat = lam.get(rijNr, 1);
            double holdHoek = lam.get(rijNr, 2);
            double holdDikte = lam.get(rijNr, 3);
            lam.set(rijNr, 1, lam.get(rijNr+1, 1));
            lam.set(rijNr, 2, lam.get(rijNr+1, 2));
            lam.set(rijNr, 3, lam.get(rijNr+1, 3));
            lam.set(rijNr+1, 1, holdMat);
            lam.set(rijNr+1, 2, holdHoek);
            lam.set(rijNr+1, 3, holdDikte);
        }

    }

    public void delete(int rijNr)
    {
        for(int i = rijNr-1; i<lam.getRowDimension();i++)
        {
            moveDown(i+1);
        }
        deleteLast();
    }
}
